import Image from "next/image"; import Link from "next/link"; import { closestMatch } from "closest-match"; import Head from "next/head"; import { useEffect, useState } from "react"; import Modal from "../../../components/modal"; import dynamic from "next/dynamic"; import { useNotification } from "../../../lib/useNotify"; import { signIn } from "next-auth/react"; import { getServerSession } from "next-auth/next"; import { authOptions } from "../../api/auth/[...nextauth]"; import AniList from "../../../components/media/aniList"; import Skeleton, { SkeletonTheme } from "react-loading-skeleton"; import "react-loading-skeleton/dist/skeleton.css"; import { Navigasi } from "../.."; const VideoPlayer = dynamic(() => import("../../../components/videoPlayer", { ssr: false }) ); export default function Info({ sessions, id, aniId, provider }) { const [epiData, setEpiData] = useState(null); const [data, setAniData] = useState(null); const [fallback, setEpiFallback] = useState(null); const [skip, setSkip] = useState({ op: null, ed: null }); const [statusWatch, setStatusWatch] = useState("CURRENT"); const [playingEpisode, setPlayingEpisode] = useState(null); const [loading, setLoading] = useState(false); const [playingTitle, setPlayingTitle] = useState(null); // console.log(epiData); useEffect(() => { const defaultState = { epiData: null, skip: { op: null, ed: null }, statusWatch: "CURRENT", playingEpisode: null, loading: false, }; // Reset all state variables to their default values Object.keys(defaultState).forEach((key) => { const value = defaultState[key]; if (Array.isArray(value)) { value.length ? eval( `set${ key.charAt(0).toUpperCase() + key.slice(1) }(${JSON.stringify(value)})` ) : eval(`set${key.charAt(0).toUpperCase() + key.slice(1)}([])`); } else { eval( `set${key.charAt(0).toUpperCase() + key.slice(1)}(${JSON.stringify( value )})` ); } }); const fetchData = async () => { // setLoading(true); let epiFallback = null; try { if (provider) { const res = await fetch( `https://api.consumet.org/meta/anilist/watch/${id}?provider=9anime` ); const epiData = await res.json(); setEpiData(epiData); } else { const res = await fetch( `https://api.moopa.my.id/meta/anilist/watch/${id}` ); const epiData = await res.json(); setEpiData(epiData); } } catch (error) { setTimeout(() => { window.location.reload(); }, 3000); } let aniData = null; if (provider) { const res = await fetch( `https://api.consumet.org/meta/anilist/info/${aniId}?provider=9anime` ); aniData = await res.json(); setAniData(aniData); } else { const res2 = await fetch( `https://api.moopa.my.id/meta/anilist/info/${aniId}` ); aniData = await res2.json(); setAniData(aniData); } if (aniData.episodes.length === 0) { const res = await fetch( `https://api.moopa.my.id/anime/gogoanime/${ aniData.title.romaji || aniData.title.english }` ); const data = await res.json(); const match = closestMatch( aniData.title.romaji, data.results.map((item) => item.title) ); const anime = data.results.filter((item) => item.title === match); if (anime.length !== 0) { const infos = await fetch( `https://api.moopa.my.id/anime/gogoanime/info/${anime[0].id}` ).then((res) => res.json()); epiFallback = infos.episodes; } setEpiFallback(epiFallback); } let playingEpisode = aniData.episodes .filter((item) => item.id == id) .map((item) => item.number); if (playingEpisode == 0) { playingEpisode = epiFallback .filter((item) => item.id == id) .map((item) => item.number); } setPlayingEpisode(playingEpisode); const title = aniData.episodes .filter((item) => item.id == id) .find((item) => item.title !== null); setPlayingTitle( title?.title || aniData.title?.romaji || aniData.title?.english ); const res4 = await fetch( `https://api.aniskip.com/v2/skip-times/${aniData.malId}/${parseInt( playingEpisode )}?types[]=ed&types[]=mixed-ed&types[]=mixed-op&types[]=op&types[]=recap&episodeLength=` ); const skip = await res4.json(); const op = skip.results?.find((item) => item.skipType === "op") || null; const ed = skip.results?.find((item) => item.skipType === "ed") || null; setSkip({ op, ed }); if (sessions) { const response = await fetch("https://graphql.anilist.co/", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ query: ` query ($username: String, $status: MediaListStatus) { MediaListCollection(userName: $username, type: ANIME, status: $status, sort: SCORE_DESC) { user { id name about (asHtml: true) createdAt avatar { large } statistics { anime { count episodesWatched meanScore minutesWatched } } bannerImage mediaListOptions { animeList { sectionOrder } } } lists { status name entries { id mediaId status progress score media { id status title { english romaji } episodes coverImage { large } } } } } } `, variables: { username: sessions?.user.name, }, }), }); const dat = await response.json(); const prog = dat.data.MediaListCollection; const gat = prog?.lists.map((item) => item.entries); const git = gat?.map((item) => item?.find((item) => item.media.id === parseInt(aniId)) ); const gut = git?.find((item) => item?.media.id === parseInt(aniId)); if (gut?.status === "COMPLETED") { setStatusWatch("REPEATING"); } else if ( gut?.status === "REPEATING" && gut?.media?.episodes === parseInt(playingEpisode) ) { setStatusWatch("COMPLETED"); } else if (gut?.status === "REPEATING") { setStatusWatch("REPEATING"); } else if (gut?.media?.episodes === parseInt(playingEpisode)) { setStatusWatch("COMPLETED"); } else if ( gut?.media?.episodes !== null && aniData.totalEpisodes === parseInt(playingEpisode) ) { setStatusWatch("COMPLETED"); setLoading(true); } } setLoading(true); }; fetchData(); }, [id, aniId, provider, sessions]); // console.log(fallback); const { Notification: NotificationComponent } = useNotification(); // console.log(); const [open, setOpen] = useState(false); const [aniStatus, setAniStatus] = useState(""); const [aniProgress, setAniProgress] = useState(parseInt(playingEpisode)); const handleStatus = (e) => { setAniStatus(e.target.value); }; const handleProgress = (e) => { const value = parseFloat(e.target.value); if (!isNaN(value) && value >= 0 && value <= data.totalEpisodes) { setAniProgress(value); } }; const handleSubmit = (e) => { e.preventDefault(); const formData = { status: aniStatus, progress: aniProgress }; console.log(formData); }; // console.log(playingTitle.title); return ( <>
{item.description}